home *** CD-ROM | disk | FTP | other *** search
/ Kit PC World De Ampliacion De Windows 95 / Kit PC World de ampliacion de Windows 95.iso / internet / sweeper / samples / olecon~1 / include / ctrlobj.h < prev    next >
Text File  |  1995-11-29  |  20KB  |  452 lines

  1. //=--------------------------------------------------------------------------=
  2. // ControlObject.H
  3. //=--------------------------------------------------------------------------=
  4. // Copyright  1995  Microsoft Corporation.  All Rights Reserved.
  5. //
  6. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
  7. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  8. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
  9. // PARTICULAR PURPOSE.
  10. //=--------------------------------------------------------------------------=
  11. //
  12. // class declaration for the COleControl object
  13. //
  14. #ifndef _CONTROLOBJECT_H_
  15.  
  16. // we need the automation object and ctlole.h
  17. //
  18. #include "AutoObj.H"
  19. #include <olectl.h>
  20.  
  21. // forward declaration
  22. //
  23. class COleControl;
  24.  
  25. //=--------------------------------------------------------------------------=
  26. // Misc Helper Functions
  27. //=--------------------------------------------------------------------------=
  28. //
  29. // given an Unknown pointer, get the COleControl * for it.  used typically
  30. // in property page code.
  31. //
  32. COleControl *ControlFromUnknown(IUnknown *);
  33.  
  34.  
  35. //=--------------------------------------------------------------------------=
  36. // Misc Constants
  37. //=--------------------------------------------------------------------------=
  38. // maximum number of arguments that can be sent to FireEvent()
  39. //
  40. #define MAX_ARGS    32
  41.  
  42. // for the types of sinks that the COleControl class has.  you shouldn't ever
  43. // need to use these
  44. //
  45. #define SINK_TYPE_EVENT      0
  46. #define SINK_TYPE_PROPNOTIFY 1
  47.  
  48. // superclass window support.  you can pass this in to DoSuperClassPaint
  49. //
  50. #define DRAW_SENDERASEBACKGROUND        1
  51.  
  52. //=--------------------------------------------------------------------------=
  53. // Various Hosts don't handle OLEIVERB_PROPERTIES correctly, so we can't use
  54. // that as our Properties verb number.  Instead, we're going to define
  55. // CTLIVERB_PROPERTIES as 1, and return that one in IOleObject::EnumVerbs,
  56. // but we'll still handle OLEIVERB_PROPERTIES correctly in DoVerb.
  57. //
  58. #define CTLIVERB_PROPERTIES     1
  59.  
  60.  
  61. //=--------------------------------------------------------------------------=
  62. // this structure is like the OLEVERB structure, except that it has a resource ID
  63. // instead of a string for the verb's name.  better support for localization.
  64. //
  65. typedef struct tagVERBINFO {
  66.  
  67.     LONG    lVerb;                // verb id
  68.     ULONG   idVerbName;           // resource ID of verb name
  69.     DWORD   fuFlags;              // verb flags
  70.     DWORD   grfAttribs;           // Specifies some combination of the verb attributes in the OLEVERBATTRIB enumeration.
  71.  
  72. } VERBINFO;
  73.  
  74. // describes an event
  75. //
  76. typedef struct tagEVENTINFO {
  77.  
  78.     DISPID    dispid;                    // dispid of the event
  79.     int       cParameters;               // number of arguments to the event
  80.     VARTYPE  *rgTypes;                   // type of each argument
  81.  
  82. } EVENTINFO;
  83.  
  84. //=--------------------------------------------------------------------------=
  85. // CONTROLOBJECTINFO
  86. //=--------------------------------------------------------------------------=
  87. // for each control you wish to expose to the programmer/user, you need to
  88. // declare and define one of the following structures.  the first part should
  89. // follow the rules of the AUTOMATIONOBJECTINFO structure.  it's pretty hard,
  90. // however, to imagine a scenario where the control isn't CoCreatable ...
  91. // once this structre is declared/defined, an entry should be put in the
  92. // global g_ObjectInfo table.
  93. //
  94. typedef struct tagCONTROLOBJECT {
  95.  
  96.     AUTOMATIONOBJECTINFO AutomationInfo;        // automation and creation information
  97.     const IID   *piidEvents;                    // IID of primary event interface
  98.     DWORD        dwControlFlags;                // control flags
  99.     WORD         wToolboxId;                    // resource ID of Toolbox Bitmap
  100.     LPSTR        szWndClass;                    // name of window control class
  101.     VARIANT_BOOL fWindowClassRegistered;        // has the window class been registered yet?
  102.     WORD         cPropPages;                    // number of property pages
  103.     const GUID **rgPropPageGuids;               // array of the property page GUIDs
  104.     WORD         cCustomVerbs;                  // number of custom verbs
  105.     VERBINFO    *rgCustomVerbs;                 // description of custom verbs
  106.     WNDPROC      pfnSubClass;                   // for subclassed controls.
  107.  
  108. } CONTROLOBJECTINFO;
  109.  
  110.  
  111. #ifndef INITOBJECTS
  112.  
  113. #define DEFINE_CONTROLOBJECT(name, clsid, progid, fn, ver, riid, pszh, piide, dwcf, w, szwc, cpp, rgppg, ccv, rgcv) \
  114. extern CONTROLOBJECTINFO name##Control \
  115.  
  116. #else
  117. #define DEFINE_CONTROLOBJECT(name, clsid, progid, fn, ver, riid, pszh, piide, dwcf, w, szwc, cpp, rgppg, ccv, rgcv) \
  118.     CONTROLOBJECTINFO name##Control = { { {clsid, progid, fn}, ver, riid, pszh, NULL, 0}, piide, dwcf, w, szwc, FALSE, cpp, rgppg, ccv, rgcv, NULL } \
  119.  
  120. #endif // !INITOBJECTS
  121.  
  122. #define OLEMISCFLAGSOFCONTROL(index)   ((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->dwControlFlags
  123. #define EVENTIIDOFCONTROL(index)      (*(((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->piidEvents))
  124. #define WNDCLASSNAMEOFCONTROL(index)   ((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->szWndClass
  125. #define CPROPPAGESOFCONTROL(index)     ((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->cPropPages
  126. #define PPROPPAGESOFCONTROL(index)     ((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->rgPropPageGuids
  127. #define CCUSTOMVERBSOFCONTROL(index)   ((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->cCustomVerbs
  128. #define CUSTOMVERBSOFCONTROL(index)    ((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->rgCustomVerbs
  129. #define BITMAPIDOFCONTROL(index)       ((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->wToolboxId
  130. #define CTLWNDCLASSREGISTERED(index)   ((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->fWindowClassRegistered
  131. #define SUBCLASSWNDPROCOFCONTROL(index)((CONTROLOBJECTINFO *)(g_ObjectInfo[index].pInfo))->pfnSubClass
  132.  
  133. //=--------------------------------------------------------------------------=
  134. // COleControl
  135. //=--------------------------------------------------------------------------=
  136. // the mother of all C++ objects
  137. //
  138. class COleControl : public CAutomationObject,
  139.                     public IOleObject, public IOleControl,
  140.                     public IOleInPlaceObject, public IOleInPlaceActiveObject,
  141.                     public IViewObject2, public IPersistPropertyBag,
  142.                     public IPersistStreamInit, public IPersistStorage,
  143.                     public IConnectionPointContainer, public ISpecifyPropertyPages,
  144.                     public IProvideClassInfo
  145. {
  146.   public:
  147.     // IUnknown methods -- there are required since we inherit from variuos
  148.     // people who themselves inherit from IUnknown.  just delegate to controlling
  149.     // unknown
  150.     //
  151.     DECLARE_STANDARD_UNKNOWN();
  152.  
  153.     //=--------------------------------------------------------------------------=
  154.     // IPersist methods.  used by IPersistStream and IPersistStorage
  155.     //
  156.     STDMETHOD(GetClassID)(THIS_ LPCLSID lpClassID);
  157.  
  158.     // IPersistStreamInit methods
  159.     //
  160.     STDMETHOD(IsDirty)(THIS);
  161.     STDMETHOD(Load)(LPSTREAM pStm);
  162.     STDMETHOD(Save)(LPSTREAM pStm, BOOL fClearDirty);
  163.     STDMETHOD(GetSizeMax)(ULARGE_INTEGER FAR* pcbSize);
  164.     STDMETHOD(InitNew)();
  165.  
  166.     // IPersistStorage
  167.     //
  168.     STDMETHOD(InitNew)(IStorage  *pStg);
  169.     STDMETHOD(Load)(IStorage  *pStg);
  170.     STDMETHOD(Save)(IStorage  *pStgSave, BOOL fSameAsLoad);
  171.     STDMETHOD(SaveCompleted)(IStorage  *pStgNew);
  172.     STDMETHOD(HandsOffStorage)(void);
  173.  
  174.     // IPersistPropertyBag
  175.     //
  176.     STDMETHOD(Load)(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog);
  177.     STDMETHOD(Save)(LPPROPERTYBAG pPropBag, BOOL fClearDirty,
  178.                     BOOL fSaveAllProperties);
  179.  
  180.     // IOleControl methods
  181.     //
  182.     STDMETHOD(GetControlInfo)(LPCONTROLINFO pCI);
  183.     STDMETHOD(OnMnemonic)(LPMSG pMsg);
  184.     STDMETHOD(OnAmbientPropertyChange)(DISPID dispid);
  185.     STDMETHOD(FreezeEvents)(BOOL bFreeze);
  186.  
  187.     // IOleObject methods
  188.     //
  189.     STDMETHOD(SetClientSite)(IOleClientSite  *pClientSite);
  190.     STDMETHOD(GetClientSite)(IOleClientSite  * *ppClientSite);
  191.     STDMETHOD(SetHostNames)(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj);
  192.     STDMETHOD(Close)(DWORD dwSaveOption);
  193.     STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker  *pmk);
  194.     STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker  * *ppmk);
  195.     STDMETHOD(InitFromData)(IDataObject  *pDataObject, BOOL fCreation, DWORD dwReserved);
  196.     STDMETHOD(GetClipboardData)(DWORD dwReserved, IDataObject  * *ppDataObject);
  197.     STDMETHOD(DoVerb)(LONG iVerb, LPMSG lpmsg, IOleClientSite  *pActiveSite, LONG lindex,
  198.                                      HWND hwndParent, LPCRECT lprcPosRect);
  199.     STDMETHOD(EnumVerbs)(IEnumOLEVERB  * *ppEnumOleVerb);
  200.     STDMETHOD(Update)(void);
  201.     STDMETHOD(IsUpToDate)(void);
  202.     STDMETHOD(GetUserClassID)(CLSID  *pClsid);
  203.     STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR  *pszUserType);
  204.     STDMETHOD(SetExtent)(DWORD dwDrawAspect,SIZEL  *psizel);
  205.     STDMETHOD(GetExtent)(DWORD dwDrawAspect, SIZEL  *psizel);
  206.     STDMETHOD(Advise)(IAdviseSink  *pAdvSink, DWORD  *pdwConnection);
  207.     STDMETHOD(Unadvise)(DWORD dwConnection);
  208.     STDMETHOD(EnumAdvise)(IEnumSTATDATA  * *ppenumAdvise);
  209.     STDMETHOD(GetMiscStatus)(DWORD dwAspect, DWORD  *pdwStatus);
  210.     STDMETHOD(SetColorScheme)(LOGPALETTE  *pLogpal);
  211.  
  212.     // IOleWindow.  required for IOleInPlaceObject and IOleInPlaceActiveObject
  213.     //
  214.     STDMETHOD(GetWindow)(HWND *phwnd);
  215.     STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);
  216.  
  217.     // IOleInPlaceObject
  218.     //
  219.     STDMETHOD(InPlaceDeactivate)(void);
  220.     STDMETHOD(UIDeactivate)(void);
  221.     STDMETHOD(SetObjectRects)(LPCRECT lprcPosRect,LPCRECT lprcClipRect) ;
  222.     STDMETHOD(ReactivateAndUndo)(void);
  223.  
  224.     // IOleInPlaceActiveObject
  225.     //
  226.     STDMETHOD(TranslateAccelerator)(LPMSG lpmsg);
  227.     STDMETHOD(OnFrameWindowActivate)(BOOL fActivate);
  228.     STDMETHOD(OnDocWindowActivate)(BOOL fActivate);
  229.     STDMETHOD(ResizeBorder)(LPCRECT prcBorder,
  230.                             IOleInPlaceUIWindow  *pUIWindow,
  231.                             BOOL fFrameWindow);
  232.     STDMETHOD(EnableModeless)(BOOL fEnable);
  233.  
  234.     // IViewObject2
  235.     //
  236.     STDMETHOD(Draw)(DWORD dwDrawAspect, LONG lindex, void  *pvAspect,
  237.                     DVTARGETDEVICE  *ptd, HDC hdcTargetDev, HDC hdcDraw,
  238.                     LPCRECTL lprcBounds, LPCRECTL lprcWBounds,
  239.                     BOOL ( __stdcall  *pfnContinue )(DWORD dwContinue),
  240.                     DWORD dwContinue);
  241.     STDMETHOD(GetColorSet)(DWORD dwDrawAspect,LONG lindex, void  *pvAspect,
  242.                            DVTARGETDEVICE  *ptd, HDC hicTargetDev,
  243.                            LOGPALETTE  * *ppColorSet);
  244.     STDMETHOD(Freeze)(DWORD dwDrawAspect, LONG lindex,
  245.                       void  *pvAspect,DWORD  *pdwFreeze);
  246.     STDMETHOD(Unfreeze)(DWORD dwFreeze);
  247.     STDMETHOD(SetAdvise)(DWORD aspects, DWORD advf, IAdviseSink  *pAdvSink);
  248.     STDMETHOD(GetAdvise)(DWORD *pAspects, DWORD  *pAdvf, IAdviseSink  * *ppAdvSink);
  249.     STDMETHOD(GetExtent)(DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE __RPC_FAR *ptd, LPSIZEL lpsizel);
  250.  
  251.     // IConnectionPointContainer methods
  252.     //
  253.     STDMETHOD(EnumConnectionPoints)(LPENUMCONNECTIONPOINTS FAR* ppEnum);
  254.     STDMETHOD(FindConnectionPoint)(REFIID iid, LPCONNECTIONPOINT FAR* ppCP);
  255.  
  256.     // ISpecifyPropertyPages
  257.     //
  258.     STDMETHOD(GetPages)(CAUUID * pPages);
  259.  
  260.     // IProvideClassInfo methods
  261.     //
  262.     STDMETHOD(GetClassInfo)(LPTYPEINFO * ppTI);
  263.  
  264.     // constructor and destructor
  265.     //
  266.     COleControl(IUnknown *pUnkOuter, int iPrimaryDispatch, void *pMainInterface);
  267.     virtual ~COleControl();
  268.  
  269.     // callable by anybody
  270.     //
  271.     static LRESULT CALLBACK ControlWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
  272.     static LRESULT CALLBACK ReflectWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
  273.     static COleControl * ControlFromHwnd(HWND hwnd) {
  274.         return (COleControl *) GetWindowLong(hwnd, GWL_USERDATA);
  275.     }
  276.  
  277.     void __cdecl FireEvent(EVENTINFO * pEventInfo, ...);
  278.     HINSTANCE    GetResourceHandle(void);
  279.  
  280.   protected:
  281.  
  282.     //=--------------------------------------------------------------------------=
  283.     // member variables that derived controls can get at.
  284.     //
  285.     // derived controls Should NOT modify the following.
  286.     //
  287.     IOleClientSite     *m_pClientSite;             // client site
  288.     IOleControlSite    *m_pControlSite;            // IOleControlSite ptr on client site
  289.     IOleInPlaceSite    *m_pInPlaceSite;            // IOleInPlaceSite for managing activation
  290.     IOleInPlaceFrame   *m_pInPlaceFrame;           // IOleInPlaceFrame ptr on client site
  291.     IOleInPlaceUIWindow *m_pInPlaceUIWindow;       // for negotiating border space with client
  292.     ISimpleFrameSite   *m_pSimpleFrameSite;        // simple frame site
  293.     IDispatch          *m_pDispAmbient;            // ambient dispatch pointer
  294.     SIZEL               m_Size;                    // the size of this control    
  295.     HWND                m_hwnd;                    // our window
  296.     HWND                m_hwndParent;              // our parent window
  297.  
  298.     // flags indicating internal state.  do not modify.
  299.     //
  300.     unsigned m_fDirty:1;                           // does the control need to be resaved?
  301.     unsigned m_fInPlaceActive:1;                   // are we in place active or not?
  302.     unsigned m_fInPlaceVisible:1;                  // we are in place visible or not?
  303.     unsigned m_fUIActive:1;                        // are we UI active or not.
  304.     unsigned m_fCreatingWindow:1;                  // indicates if we're in CreateWindowEx or not
  305.  
  306.     unsigned short      m_cAccel;                  // Size of accelerator table.
  307.     HACCEL              m_hAccel;                  // Accelerator table.
  308.  
  309.     // dervied controls can/should modify the following:
  310.     //
  311.     DWORD               m_dwWindowStyle;           // window flags for our HWND
  312.     DWORD               m_dwWindowExStyle;         // Window Style Extended Bits
  313.     LPSTR               m_szWindowTitle;           // title of the window.
  314.  
  315.     //=--------------------------------------------------------------------------=
  316.     // methods that derived controls can override, but may need to be called
  317.     // from their versions.
  318.     //
  319.     virtual void      ViewChanged(void);
  320.     virtual HRESULT   InternalQueryInterface(REFIID riid, void **ppvObjOut);
  321.  
  322.     //=--------------------------------------------------------------------------=
  323.     // member functions that derived controls will need to call from time to time
  324.     //
  325.     HRESULT      DoSuperClassPaint(HDC, LPCRECTL);
  326.     HRESULT      RecreateControlWindow(void);
  327.     BOOL         DesignMode(void);
  328.     BOOL         GetAmbientProperty(DISPID, VARTYPE, void *);
  329.     BOOL         GetAmbientFont(IFont **ppFontOut);
  330.     void         ModalDialog(BOOL fShow);
  331.     void         InvalidateControl(LPCRECT prc);    
  332.     BOOL         SetControlSize(SIZEL *pSizel);
  333.  
  334.     // IPropertyNotifySink stuff.
  335.     //
  336.     inline void  PropertyChanged(DISPID dispid) {
  337.         m_cpPropNotify.DoOnChanged(dispid);
  338.     }
  339.     inline BOOL  RequestPropertyEdit(DISPID dispid) {
  340.         return m_cpPropNotify.DoOnRequestEdit(dispid);
  341.     }
  342.  
  343.     // subclassed windows controls support ...
  344.     //
  345.     inline HWND  GetOuterWindow(void) {
  346.         return (m_hwndReflect) ? m_hwndReflect : m_hwnd;
  347.     }
  348.  
  349.   private:
  350.     //=--------------------------------------------------------------------------=
  351.     // the following are methods that ALL control writers must override and implement
  352.     //
  353.     STDMETHOD(LoadBinaryState)(IStream *pStream) PURE;
  354.     STDMETHOD(SaveBinaryState)(IStream *pStream) PURE;
  355.     STDMETHOD(LoadTextState)(IPropertyBag *pPropertyBag, IErrorLog *pErrorLog) PURE;
  356.     STDMETHOD(SaveTextState)(IPropertyBag *pPropertyBag, BOOL fWriteDefault) PURE;
  357.     STDMETHOD(OnDraw)(HDC hdcDraw, LPCRECTL prcBounds, LPCRECTL prcWBounds, HDC hicTargetDev) PURE;
  358.     virtual LRESULT WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) PURE;
  359.     virtual BOOL    RegisterClassData(void) PURE;
  360.  
  361.     //=--------------------------------------------------------------------------=
  362.     // OVERRIDABLES -- methods controls can implement for customized functionality
  363.     //
  364.     virtual void    AmbientPropertyChanged(DISPID dispid);
  365.     virtual void    BeforeCreateWindow(void);
  366.     virtual void    BeforeDestroyWindow(void);
  367.     virtual HRESULT DoCustomVerb(LONG lVerb);
  368.     virtual BOOL    OnSetExtent(SIZEL *pSizeL);
  369.     virtual BOOL    OnSpecialKey(LPMSG);
  370.     virtual BOOL    OnGetPalette(HDC, LOGPALETTE **);
  371.     virtual BOOL    InitializeNewState();
  372.     virtual void    AfterCreateWindow(void);
  373.  
  374.     //=--------------------------------------------------------------------------=
  375.     // methods that various people internally will share.  not needed, however, by
  376.     // any inherting classes.
  377.     //
  378.     HRESULT         InPlaceActivate(LONG lVerb);
  379.     void            SetInPlaceVisible(BOOL);
  380.     void            SetInPlaceParent(HWND);
  381.     HWND            CreateInPlaceWindow(int x, int y);
  382.     HRESULT         m_SaveToStream(IStream *pStream);
  383.     HRESULT         LoadStandardState(IPropertyBag *pPropertyBag, IErrorLog *pErrorLog);
  384.     HRESULT         LoadStandardState(IStream *pStream);
  385.     HRESULT         SaveStandardState(IPropertyBag *pPropertyBag);
  386.     HRESULT         SaveStandardState(IStream *pStream);
  387.  
  388.     //=--------------------------------------------------------------------------=
  389.     // member variables we don't want anybody to get their hands on, including
  390.     // inheriting classes
  391.     //
  392.     HWND              m_hwndReflect;               // for subclassed windows
  393.     IOleAdviseHolder *m_pOleAdviseHolder;          // IOleObject::Advise holder object
  394.     IAdviseSink      *m_pViewAdviseSink;           // IViewAdvise sink for IViewObject2
  395.     unsigned short    m_nFreezeEvents;             // count of freezes versus thaws
  396.     unsigned          m_fHostReflects:1;           // does the host reflect messages?
  397.     unsigned          m_fCheckedReflecting:1;      // have we checked above yet?
  398.  
  399.     // internal flags.  various other flags are visible to the end control class.
  400.     //
  401.     unsigned m_fModeFlagValid:1;                   // we stash the mode as much as possible
  402.     unsigned m_fSaveSucceeded:1;                   // did an IStorage save work correctly?
  403.     unsigned m_fViewAdvisePrimeFirst: 1;           // for IViewobject2::setadvise
  404.     unsigned m_fViewAdviseOnlyOnce: 1;             // for iviewobject2::setadvise
  405.     unsigned m_fUsingWindowRgn:1;                  // for SetObjectRects and clipping
  406.  
  407.     VARIANT_BOOL m_fRunMode;                       // are we in run mode or not?
  408.  
  409.     class CConnectionPoint : public IConnectionPoint {
  410.       public:
  411.         IUnknown **m_rgSinks;
  412.  
  413.         // IUnknown methods
  414.         //
  415.         STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) ;
  416.         STDMETHOD_(ULONG,AddRef)(THIS) ;
  417.         STDMETHOD_(ULONG,Release)(THIS) ;
  418.  
  419.         // IConnectionPoint methods
  420.         //
  421.         STDMETHOD(GetConnectionInterface)(IID FAR* pIID);
  422.         STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer FAR* FAR* ppCPC);
  423.         STDMETHOD(Advise)(LPUNKNOWN pUnkSink, DWORD FAR* pdwCookie);
  424.         STDMETHOD(Unadvise)(DWORD dwCookie);
  425.         STDMETHOD(EnumConnections)(LPENUMCONNECTIONS FAR* ppEnum);
  426.  
  427.         void DoInvoke(DISPID dispid, DISPPARAMS * pdispparam);
  428.         void DoOnChanged(DISPID dispid);
  429.         BOOL DoOnRequestEdit(DISPID dispid);
  430.  
  431.         COleControl *m_pOleControl();
  432.         CConnectionPoint(BYTE b){
  433.             m_bType = b;
  434.             m_rgSinks = NULL;
  435.             m_cSinks = 0;
  436.         }
  437.         ~CConnectionPoint();
  438.  
  439.       private:
  440.         BYTE m_bType;
  441.         int  m_cSinks;
  442.  
  443.     } m_cpEvents, m_cpPropNotify;
  444.  
  445.     // so they can get at some of our protected things, like AddRef, QI, etc.
  446.     //
  447.     friend CConnectionPoint;
  448. };
  449.  
  450. #define _CONTROLOBJECT_H_
  451. #endif // _CONTROLOBJECT_H_
  452.